package eighthwork.two.control;

import eighthwork.two.exception.BinaryException;
import eighthwork.two.exception.FormatException;

import java.util.regex.Pattern;

/**
 * @author ：chenzikang
 * @date ： 2020/4/10
 */

public class FactorialControl {

    /**
     * 判定输入的是否为整数
     */
    public static boolean isNumeric(String string) {
        Pattern pattern = Pattern.compile("[0-9]*");
        return pattern.matcher(string).matches();
    }

    /**
     * 判定输入的是否为十六进制
     */
    public static boolean hexadecimal(String string) {
        Pattern pattern = Pattern.compile("(0[xX])?[A-Fa-f0-9]");
        return pattern.matcher(string).matches();
    }

    /**
     * 求阶乘函数, 16进制数仅支持0--9，A--F，a--f单个输入
     */
    public static int factorialComputation(String n) throws FormatException, BinaryException {
        //判定n是否为整数
        Boolean boo = isNumeric(n);


        //判定n是否为十六进制数
        Boolean boo2 = hexadecimal(n);


        //如果为十六进制数，抛出异常
        if (boo2) {
            throw new BinaryException("");
        }

        //如果为非整数，抛出异常
        if (!boo) {
            throw new FormatException("输入的数字不符合要求");
        }

        //将n转换为int型
        int num = Integer.parseInt(n);

//      循环求得阶乘结果
        for (int i = num - 1; i > 0; i--) {
            num = num * i;
        }

        //返回结果
        return num;

    }


    /**
     * 当已判定为16进制数时，求阶乘
     */

    public static int directFactorialComputation(String n) {

        //将n转换为int型
        int num = Integer.parseInt(n);


//      循环求得阶乘结果
        for (int i = num - 1; i > 0; i--) {
            num = num * i;
        }

        //返回结果
        return num;

    }
}
